package lu.med.praxiswahl.wahlumed.client.kalender;

import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.table.AbstractTableModel;

import lu.med.praxiswahl.wahlumed.client.wclient.Main;
import lu.med.praxiswahl.wahlumed.model.beans.CalendarTBL;

/**
 * 
 * @author Lars Holger Roth
 */
public class WochenplanTableModel extends AbstractTableModel
{

    /**
     * 
     */
    private static final long serialVersionUID = -5686554221413014371L;
    private String[] dates = new String[7];
    private Calendar curDate; // Das aktuelle Datum
    private KalenderTableDataRow[][] data = new KalenderTableDataRow[60][7];
    private Main dataManager;

    public static String[] uhrzeit =
    { "08:00", "08:15", "08:30", "08:45", "09:00", "09:15", "09:30", "09:45",
	    "10:00", "10:15", "10:30", "10:45", "11:00", "11:15", "11:30",
	    "11:45", "12:00", "12:15", "12:30", "12:45", "13:00", "13:15",
	    "13:30", "13:45", "14:00", "14:15", "14:30", "14:45", "15:00",
	    "15:15", "15:30", "15:45", "16:00", "16:15", "16:30", "16:45",
	    "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30",
	    "18:45", "19:00", "19:15", "19:30", "19:45", "20:00", "21:00",
	    "21:15", "21:30", "21:45", "22:00", "22:15", "22:30", "22:45",
	    "23:00", "23:15", "23:30" };

    public WochenplanTableModel(Main dataManager)
    {
	curDate = new GregorianCalendar();
	this.dataManager = dataManager;
	clearData();
    }

    public void clearData()
    {
	for (int row = 0; row < 60; row++)
	{
	    for (int col = 0; col < 7; col++)
	    {
		data[row][col] = new KalenderTableDataRow();
	    }
	}
    }

    public int getColumnCount()
    {
	return 8;
    }

    @Override
    public String getColumnName(int columnIndex)
    {
	switch (columnIndex)
	{
	case 0:
	    return "RV";
	case 1:
	    return "Montag (" + dates[0] + ")";
	case 2:
	    return "Dienstag (" + dates[1] + ")";
	case 3:
	    return "Mittwoch (" + dates[2] + ")";
	case 4:
	    return "Donnerstag (" + dates[3] + ")";
	case 5:
	    return "Freitag (" + dates[4] + ")";
	case 6:
	    return "Samstag (" + dates[5] + ")";
	case 7:
	    return "Sonntag (" + dates[6] + ")";
	}
	return "";
    }

    public Calendar getCurDate()
    {
	return this.curDate;
    }

    public int getRowCount()
    {
	return 60;
    }

    @Override
    public Object getValueAt(int row, int column)
    {
	if (column == 0)
	{
	    return uhrzeit[row];
	}
	// Setzt den Namen zusammen
	if (data[row][(column - 1)].getUsTyp().equals(""))
	    return "";
	return data[row][(column - 1)].getUsTyp() + " / "
		+ data[row][(column - 1)].getName();
    }

    @Override
    public boolean isCellEditable(int row, int column)
    {
	return false;
    }

    public boolean isNewPatient(int row)
    {
	return false;
    }

    public void retrieveFromDatabase()
    {	
	// Hier nur alle Termine in einem bestimmten Zeitraum suchen,
	// unabhängig von den Uhrzeiten
	// Aus curDate leitet sich die KW ab
	// dann müssen alle Tage der Kalenderwoche ermittelt werden
	this.clearData();

	@SuppressWarnings("unused")
	int kw = curDate.get(Calendar.WEEK_OF_YEAR);
	int curDay = curDate.get(Calendar.DAY_OF_WEEK); // Liefert
	// den Wochentag und weiß daher mit welchem Datum begonnen werden muss

	Calendar date = (Calendar) curDate.clone();

	// Falls Montag, der Tag und die sieben folgenden
	if (curDay == Calendar.TUESDAY)
	{
	    // Dienstag, es muss also ein Tag zurück gegangen werden
	    date.add(Calendar.DAY_OF_YEAR, -1);
	}
	else if (curDay == Calendar.WEDNESDAY)
	{
	    // Mittwoch, 2 Tage zurück
	    date.add(Calendar.DAY_OF_YEAR, -2);
	}
	else if (curDay == Calendar.THURSDAY)
	{
	    // Mittwoch, 2 Tage zurück
	    date.add(Calendar.DAY_OF_YEAR, -3);
	}
	else if (curDay == Calendar.FRIDAY)
	{
	    // Mittwoch, 2 Tage zurück
	    date.add(Calendar.DAY_OF_YEAR, -4);
	}
	else if (curDay == Calendar.SATURDAY)
	{
	    // Mittwoch, 2 Tage zurück
	    date.add(Calendar.DAY_OF_YEAR, -5);
	}
	else if (curDay == Calendar.SUNDAY)
	{
	    // Mittwoch, 2 Tage zurück
	    date.add(Calendar.DAY_OF_YEAR, -6);
	}

	// Von diesem Tag, dem ersten der KW aus, werden nun
	// die Daten für die nächsten sieben Tage gelesen und
	// in die Array Listen eingetragen

	/*for (int dayColumn = 0; dayColumn < 7; dayColumn++)
	{
	    dates[dayColumn] = date.get(Calendar.DAY_OF_MONTH) + "."
		    + (date.get(Calendar.MONTH) + 1) + ". "
		    + date.get(Calendar.YEAR);
	    CalendarTBL[] tmp = dataManager.getCalendarContext()
		    .getAllTermineByDate(date);

	    for (int i = 0; i < tmp.length; i++)
	    {
		dataManager.getCalendarContext().getA_CalendarInstance(tmp[i]);

		KalenderTableDataRow curData = new KalenderTableDataRow();
		String usTyp = dataManager.getCalendarContext().getUS_Typ();
		if (usTyp == null)
		{
		    usTyp = "";
		}
		curData.setUsTyp(usTyp);
		curData.setUhrzeit(dataManager.getCalendarContext()
			.getTerminUrhZeit());

		// Setzt den Namen zusammen
		String name = "";

		name += dataManager.getCalendarContext().getPatientin()
			.getNachname_1()
			+ dataManager.getCalendarContext().getPatientin()
				.getNachname_2()
			+ " "
			+ dataManager.getCalendarContext().getPatientin()
				.getNachname_3()
			+ " "
			+ dataManager.getCalendarContext().getPatientin()
				.getVorname();

		curData.setName(name);
		
		*/
	
	for (int dayColumn = 0; dayColumn < 7; dayColumn++)
	{
	    dates[dayColumn] = date.get(Calendar.DAY_OF_MONTH) + "."
		    + (date.get(Calendar.MONTH) + 1) + ". "
		    + date.get(Calendar.YEAR);
	    CalendarTBL[] tmp = dataManager.getCalendarContext()
		    .getAllTermineByDate(date);

	    for (int i = 0; i < tmp.length; i++)
	    {
		
		KalenderTableDataRow curData = new KalenderTableDataRow();
		String usTyp = tmp[i].getUntersuchungstyp();
		if (usTyp == null)
		{
		    usTyp = "";
		}
		curData.setUsTyp(usTyp);
		curData.setUhrzeit(tmp[i].getRv_uhrzeit());

		// Setzt den Namen zusammen
		String name = "";

		name += tmp[i].getCustomer().getNachname_1()+" "+
		tmp[i].getCustomer().getNachname_2()+" "+tmp[i].getCustomer().getNachname_3() +" "+tmp[i].getCustomer().getVorname();
		

		curData.setName(name);

		for (int u = 0; u < uhrzeit.length; u++)
		{
		    if (curData.getUhrzeit().equals(uhrzeit[u]))
		    {
			data[u][dayColumn] = curData;
			break;
		    }
		}
	    }

	    date.add(Calendar.DAY_OF_YEAR, 1);
	}
	this.fireTableDataChanged();
	this.fireTableStructureChanged();
    }

    public void setCurDate(Calendar c)
    {
	curDate = c;
    }

    @Override
    public void setValueAt(Object d, int row, int column)
    {
	return;
    }
}
